package org.web.tablesqlcheck.sdk.dto;

import lombok.Getter;
import lombok.Setter;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;


/**
 * 规则分为三部分，规则基本信息，指定参数定义，校验参数。
 * (1)规则基本信息包括：规则名称，规则状态，规则信息，严重级别，规则描述。
 * (2)指定参数定义：函数名称，参数类型，参数名称，参数值。这部分内容是最复杂的。解析后参数，都统一定义成List<String>.
 * 本质上讲，校验的核心参数信息都是comment, 校验是否存在明确定义 。
 * (3)校验参数：校验方式，校验值，校验结果。校验方式主要是正则表达式。
 * 以上信息，可以用一行记录来定义。
 * */
@Setter
@Getter
public class CheckRuleDTO implements TableSqlCheckConstant {




    /**
     * 规则名称，规则名称，具有逻辑唯一性。
     */
    private String ruleName;

    /**
     * 规则状态，ON|OFF，ON表示生效，OFF表示不生效，只有生效的规则允许用来做校验。
     *
     * @see STATUS
     */
    @Pattern(regexp = "^(ON|OFF)$", message = "规则状态，ON|OFF，ON表示生效，OFF表示不生效，只有生效的规则允许用来做校验。且只允许从(ON|OFF)选择，且大小写敏感。")
    @NotBlank(message = "ruleStatus规则状态必须指定，且只允许从(ON|OFF)选择，且大小写敏感。")
    private String ruleStatus = STATUS.ON.name();

    /**
     * 规则信息，其包含两部分，一部分是函数，另一部分是参数值。
     *
     * @see FUNCTION_TYPE 用于参考当前版本所支持的函数种类。
     */
    @NotBlank(message = "functionInfo函数信息必须指定。")
    private String functionInfo;

    @Pattern(regexp = "^(Min|NotBlank|Pattern|Include|Forbidden|Contain)$", message = "函数名称，参见FUNCTION_TYPE。")
    private String functionName;

    /**
     * 规则描述。
     */
    private String ruleComment;
    private PARAM_ENUM paramEnum;

    /**
     * 参数类型，TABLE 表示表相关的属性，COLUMN表示列相关的属性。
     *
     * @see PARAM_TYPE
     */
    @Pattern(regexp = "^(TABLE|COLUMN)$", message = "参数类型，TABLE 表示表相关的属性，COLUMN表示列相关的属性。且只允许从(TABLE|COLUMN)选择，且大小写敏感。")
    @NotBlank(message = "paramType参数类型必须指定，且只允许从(TABLE|COLUMN)选择，且大小写敏感。")
    private String paramType;

    /**
     * 参数名称，不同参数类型，参数名称也不尽相同。
     *
     * @see PARAM_ENUM
     */
    private String paramName;

    /**
     * 严重级别，PROHIBIT表示禁止，WARN表示警告，INFO表示一般。
     *
     * @see LEVEL
     */
    @Pattern(regexp = "^(STRICT|WARN|INFO)$", message = "严重级别，STRICT 表严格遵守，WARN表示警告，INFO表示一般。且只允许从(STRICT|WARN|INFO)选择，且大小写敏感。")
    private String ruleLevel = LEVEL.INFO.name();


    @Override
    public String toString() {
        return "CheckRuleDTO{" +
                "ruleName='" + ruleName ;
    }
}
